home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_46 / driver.c < prev    next >
C/C++ Source or Header  |  1995-01-01  |  3KB  |  202 lines

  1. /*
  2.     Example code that uses CT-VOICE.DRV to access the Soundblaster
  3.     DAC channel. Only plays voc files up to 64K because it doesn't
  4.     bother with farmalloc and multiple fread calls.
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <alloc.h>
  9. #include <dos.h>
  10. #include <io.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13.  
  14. char far *driver_mem = NULL;
  15. void far (*driver)(void) = NULL;
  16.  
  17. void LoadDriver(void)
  18. {
  19.     FILE *f;
  20.     long length;
  21.     char *sp;
  22.     char sn[129];
  23.  
  24.     strcpy(sn,"");
  25.     sp = getenv("SOUND");
  26.     if(sp)
  27.     {
  28.         strcpy(sn,sp);
  29.         if(sn[strlen(sn)-1] != '\\')
  30.             strcat(sn,"\\");
  31.     }
  32.     strcat(sn,"drv\\CT-VOICE.DRV");
  33.  
  34.     f = fopen(sn,"rb");
  35.     if(!f)
  36.         return;
  37.     length = filelength(fileno(f));
  38.  
  39.     driver_mem = (char far *)malloc((int)length + 16);
  40.     if(FP_SEG(driver_mem) != 0)
  41.         driver = MK_FP(FP_SEG(driver_mem)+1,0);
  42.     else
  43.         driver = (void *) driver_mem;
  44.  
  45.     fread(driver,1,(int)length,f);
  46.  
  47.     fclose(f);
  48. }
  49.  
  50. int GetVersion(void)
  51. {
  52.     _BX = 0;
  53.     (*driver)();
  54.     return _AX;
  55. }
  56.  
  57. void SetIOAddr(int base)
  58. {
  59.     _BX = 1;
  60.     _AX = base;
  61.     (*driver)();
  62. }
  63.  
  64. void SetIRQ(int irq)
  65. {
  66.     _BX = 2;
  67.     _AX = irq;
  68.     (*driver)();
  69. }
  70.  
  71. int InitialiseDriver(void)
  72. {
  73.     _BX = 3;
  74.     (*driver)();
  75.     return _AX;
  76. }
  77.  
  78. void UninstallDriver(void)
  79. {
  80.     _BX = 9;
  81.     (*driver)();
  82. }
  83.  
  84. void SpeakerOnOff(int onoff)
  85. {
  86.     _BX = 4;
  87.     _AX = onoff & 0x0001;
  88.     (*driver)();
  89. }
  90.  
  91. void SetStatusWord(unsigned int *addr)
  92. {
  93.     _BX = 5;
  94.     _ES = FP_SEG(addr);
  95.     _DI = FP_OFF(addr);
  96.     (*driver)();
  97. }
  98.  
  99. void OutputVoice(char *buffer)
  100. {
  101.     _BX = 6;
  102.     _ES = FP_SEG(buffer);
  103.     _DI = FP_OFF(buffer);
  104.     (*driver)();
  105. }
  106.  
  107. void InputVoice(int sample_rate, char *buffer, long length)
  108. {
  109.     _BX = 7;
  110.     _AX = sample_rate;
  111.     _ES = FP_SEG(buffer);
  112.     _DI = FP_OFF(buffer);
  113.     _DX = (unsigned)(length >> 16);
  114.     _CX = (unsigned)(length & 0x0000ffff);
  115.     (*driver)();
  116. }
  117.  
  118. void StopVoiceProcess(void)
  119. {
  120.     _BX = 8;
  121.     (*driver)();
  122. }
  123.  
  124. int PauseOutputVoice(void)
  125. {
  126.     _BX = 10;
  127.     (*driver)();
  128.     return _AX;
  129. }
  130.  
  131. int ContinueOutputVoice(void)
  132. {
  133.     _BX = 11;
  134.     (*driver)();
  135.     return _AX;
  136. }
  137.  
  138. char *LoadVOC(char *name)
  139. {
  140.     FILE *f;
  141.     char *buf;
  142.     long length;
  143.  
  144.     f = fopen(name,"rb");
  145.     if(!f)
  146.         return NULL;
  147.  
  148.     length = filelength(fileno(f)) - 0x1a;
  149.  
  150.     if (length > 65000L) length = 65000L;
  151.  
  152.     buf = (char *)malloc((int)length);
  153.     fseek(f,0x1a,SEEK_SET);
  154.     fread(buf,1,(unsigned int)length,f);
  155.  
  156.     fclose(f);
  157.     return buf;
  158. }
  159.  
  160. void main(int argc, char *argv[])
  161. {
  162.     char *b;
  163.     unsigned int status;
  164.  
  165.     if (argc == 1)
  166.     {
  167.         printf("Please supply a filename.\n");
  168.         exit(1);
  169.     }
  170.  
  171.     LoadDriver();
  172.     if(driver == NULL)
  173.     {
  174.         printf("Could not load CT-VOICE.DRV\n");
  175.         exit(1);
  176.     }
  177.  
  178.     printf("Voice version %d\n",GetVersion());
  179.  
  180.     if(InitialiseDriver())
  181.     {
  182.         printf("Could not initialise driver.\n");
  183.         exit(1);
  184.     }
  185.     SetStatusWord(&status);
  186.  
  187.     b = LoadVOC(argv[1]);
  188.  
  189.     OutputVoice(b);
  190.  
  191.     while(status)
  192.         ;
  193.  
  194.     free(b);
  195.  
  196.     UninstallDriver();
  197.  
  198.     free(driver_mem);
  199.  
  200.     exit(0);
  201. }
  202.